//
//  WBNetworkManager.swift
//  微博
//
//  Created by dong on 2017/11/21.
//  Copyright © 2017年 dong. All rights reserved.
//

import UIKit
import AFNetworking

///swift的枚举支持任意数据类型
///switch/enum在oc中都只是支持整数
enum WBHTTPMethod{
    case GET
    case POST
    
}
///网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    
    ///静态区/常量／闭包
    //在第一次访问时执行闭包，并且将结果保存在常量中
    static let shared: WBNetworkManager = {
        
    //实例化对象
    let instance = WBNetworkManager()
        
    //设置相应反序列化支持的数据类型
    instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
    //返回对象
    return instance
    }()
    
 
    ///用户账号的懒加载属性
    lazy var userAccount = WBUserAccount()
    
    /// 用户登陆标记[计算心属性]
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    ///专门负责拼接token的网络请求方法
    func tokenRequest(method: WBHTTPMethod = .GET, UrlString: String, parameters: [String :AnyObject]?, completion: @escaping (_ json: AnyObject?, _ isSuccess: Bool) ->()){
        
        //处理token字典
        //0> 判断token是否为nil，为nil直接返回,程序执行过程中，一般token不会为nil
        guard let token = userAccount.access_token else{
            
            // 发送通知，提示用户登陆
            print("没有token,需要登陆")
            
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
            
            completion(nil, false)
            
            return
        }
        
        
        //1> 判断 参数字典是否存在，如果为nil，应该新建一个字典
        var parameters = parameters
        if parameters == nil{
            //实例化字典
            parameters = [String: AnyObject]()
        }
        
        //2> 设置参数字典,代码在此处字典一定有值
        parameters!["access_token"] = token as AnyObject
        //调用request发起真正的网络请求方法
        request(UrlString: UrlString, parameters: parameters, completion: completion)
    }
    /// 封装AFN的 GET／POST请求
    ///
    /// - parameter method:      GET/POST
    /// - parameter URLString:   URLSting
    /// - parameter parameters:  参数字典
    /// - parameter cpmpletion:  完成回调[json(字典／数组),是否成功]
    ///
    ///使用一个函数封装的GET／POST请求
    func request(method: WBHTTPMethod = .GET, UrlString: String, parameters: [String :AnyObject]?, completion: @escaping (_ json: AnyObject?, _ isSuccess: Bool) ->()) {
        
        //成功要进行的回调，参数json，是否成功
        let success = { (task: URLSessionDataTask, json: Any?) in
            
            completion(json as AnyObject, true)
        }
        
        //成功要进行的回调，参数错误信息，可以进行筛选，比如http错误码，对请求进行参照
        let failure = { (task: URLSessionDataTask?, error: Error) in
            
            //针对 403 处理用户 token 过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token过期了")
                
                // 发送通知，提示用户再次登陆（本方法不知道被谁调用，谁接收到通知，谁处理）
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: "bad token")
            }
            
            print("网络请求错误\(error)")
            completion(error as AnyObject, false)
        }
        
        if method == .GET{
            
            get(UrlString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else{
            
            post(UrlString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
    }

}
